import koa from 'koa'
import MockRouter from './router/mock' // 本地mock数据
import AdminRouter from './router/admin' // 后台管理的接口
import UserRouter from './router/user' //用户管理接口
import SystemRouter from './router/system' // 系统相关接口

import koaBody from 'koa-body' // 处理post请求和文件上传
import cors from 'koa-cors'

let app = new koa

import {Server} from 'http'
// 配置跨域
app.use(cors())
// app.use(koaCompress({
//     threshold: 1024, // 响应体大于 1KB 才压缩
//     filter: (ctx) => ctx.acceptsEncodings('br', 'gzip'), // 支持 Brotli 和 Gzip
//     flush: require('zlib').Z_SYNC_FLUSH, // 立即压缩并发送数据
//   }));
  
//   app.use(async (ctx) => {
//     ctx.body = 13; // 原始 JSON 数据
//   });

// 配置日志信息
import { accessLogger,httpLogger,formatText,logger } from './until/log'
app.use(accessLogger())
app.use(koaBody())

// 监听应用程序接口
app.use(async (ctx,next) => {
    const start:any = new Date();					          // 响应开始时间
    let intervals								              // 响应间隔时间
    try {
        await next();
        intervals = new Date() as any - start;
        httpLogger.info(formatText.response(ctx, intervals))	  //记录响应日志
    } catch (error) {
        intervals = new Date() as any - start;
        httpLogger.error(formatText.error(ctx,error,intervals)) //记录异常日志
    }
})

// 本地mock数据中间件
app.use(MockRouter.routes())
app.use(MockRouter.allowedMethods())

// 后台管理的中间件
app.use(AdminRouter.routes())
app.use(AdminRouter.allowedMethods())


// 用户管理的中间件
app.use(UserRouter.routes())
app.use(UserRouter.allowedMethods())

// 系统相关中间件
app.use(SystemRouter.routes())
app.use(SystemRouter.allowedMethods())


const run = (port:number | string):Server => {
    return app.listen(port,() => {
        logger.info("http://127.0.0.1:"+ port +" is running")
    }).on("close",() => {
        logger.info("close")
    })
}

export default run